package core;

import Index.Index;
import Index.TreeNode;
import sha1.SHA1;

import java.io.IOException;
import java.util.*;

/*

 */
public class JitRm {
    //将文件从暂存区删除
    public static boolean remove_cached(String path) throws Exception {
        //读取index暂存区
        Index index=new Index();
        TreeNode indexTree= index.getIndexTree();
        //对indexTree进行层次遍历，删除路径==path的那个节点
        Queue<TreeNode> q=new LinkedList<TreeNode>();
        q.add(indexTree);
        while(!q.isEmpty()){
            int number=q.size();
            //层次遍历
            for(int i=0;i<number;i++){
                //读取队列头节点,并出队
                TreeNode current=q.poll();
                //获取其孩子节点
                if(current.getChildren()!=null) {
                    ArrayList<TreeNode> children = current.getChildren();
                    Iterator<TreeNode> iterator=children.iterator();
                    //对孩子节点逐一比较
                    while(iterator.hasNext()){
                        TreeNode child=iterator.next();
                        if (child.getpath().equals(path)) {
                            //处理暂存区,把这个节点移除
                            iterator.remove();
                            System.out.println("成功删除路径为" + path + "的暂存区文件");
                            //更新暂存区的tree
                            //更新hash
                            String date=String.valueOf(new Date());
                            indexTree.setId(SHA1.getHash(date));
                            //替换当前暂存区的tree
                            index.setIndexTree(indexTree);
                            //写入到.jit/index中
                            index.writeObject();

                            //处理index区的bloblist
                            //避免前缀重复问题，对tree和blob进行不同处理
                            if(child.getType().equals("tree")) {
                                //对文件夹加一个\以作区分
                                remove_indexBlobList(path + "\\");
                            }
                            else{
                                //对于文件，直接remove即可
                                remove_indexBlobList(path);
                            }
                            //更新目前indextree的hash
                            return true;
                        } else {
                            q.add(child);
                        }

                    }
                }
            }
        }
        System.out.println("暂存区不存在该路径的节点");
        return false;
    }


    /*
        普通rm实现将文件从暂存区和工作区删除
        （只有之前的commit含有当前rm文件，我们才能从工作区删除，否则还是只从暂存区删除）
     */


    //实现对index的更新
    public static void remove_indexBlobList(String path) throws IOException {
        //读取index暂存区
        Index index=new Index();
        //删除bloblist对应行
        ArrayList<String> blobList= index.getBlobList();
        blobList.removeIf(deletePath -> deletePath.contains(path));
        //写入index
        index.writeObject();
    }
}
